from django.db.models import F, Q, Avg, Sum
from django.http import HttpResponse
from django.shortcuts import render

# Create your views here.
from drf21_04.models import student


def index(request):
    # 查询所有的学生信息
    stu = student.objects.all()  # c查询出来的是queryset列表
    print(stu)

    """
    <QuerySet [<student: student object (3)>, <student: student object (4)>, <student: student object (5)>, <student: student object (6)>, <student: student object (7)>, <student: student object (8)>, <student: student object (9)>]>
    all()查询处理的是QuerySet类型的数据，QuerySet类似于列表，里面存储的是model类的对象
    """

    # 查询单个学生的信息

    stu1 = student.objects.filter(age=22)
    print(stu1)  # 返回的是QuerySet类型的数据  ,查询数据，只要匹配上就添加到QuerySet数据中

    # stu2 = student.objects.filter(name='guxuan')  #如果没有查到数据则直接返回一个QuerySet列表
    stu2 = student.objects.filter(name='顾轩')
    print(stu2)

    stu3 = student.objects.get(name='顾轩')
    print(stu3.phone)  # 查询 出来的数据是model类的对象  stu3.xxxx 可以获取对应属性的属性值

    try:
        stu4 = student.objects.get(name='顾轩1')
        print(stu4)
    except:
        print('w3r5252')

    # print(stu4)#get查询 只能查询到一条数据   出来的数据是model类的对象  如果没有查询到对应的数据，则直接报错
    return HttpResponse('查询成功')


# filter 和get 的区别？？
# filter和get都是过滤查询方法  get只能返回一个对象，如果没有查询到结果，则抛出异常 而filter 返回的是一个queryset列表，如果没有查询到则返回一个空的queryset列表


def index2(request):
    # stu = student.objects.get(name='顾轩')
    # 第一种修改
    # stu.phone = 19728408054
    # # 一定要保存数据
    # stu.save()
    # 第二种
    # stu = student.objects.filter(name='顾轩').update(phone='19828408054')
    # stu = student.objects.get(name='顾轩')
    # stu.update(phone='19728408054')#'student' object has no attribute 'update'  原因update不能被模型对象所调用

    # 修改表中某个字段所有的数据
    student.objects.update(age=20)  # 或者 student.objects.all().update(age=20)
    return HttpResponse('查询成功')


def index3(request):
    # 第一种删除方法 get
    # student.objects.get(id=3).delete()
    # 第二种删除方法 filter
    # student.objects.filter(id=4).delete()

    # 不能使用模型管理器删除所有的数据
    # student.objects.delete()#报错
    # student.objects.all().delete()
    return HttpResponse('删除成功')


def index4(request):
    # 更新或者添加 如果查询不到则添加 如果存在则修改
    student.objects.update_or_create(id=3, defaults={
        'name': '顾轩',
        'age': 22,
        'sex': 0,
        'qq': '2113757820@qq.com',
        'phone': '19928408054',
    })
    # 查询或者添加 如果查询不到则添加，如果查询到则返回数据

    stu = student.objects.get_or_create(id=2, defaults={
        'name': '顾轩2',
        'age': 23,
        'sex': 0,
        'qq': '2113757820@qq.com',
        'phone': '19928408054',
    })
    print(stu)
    return HttpResponse('查询成功')


def index5(request):
    # 第一种多个字段过滤查询方法
    stu = student.objects.filter(name='顾轩2', age=23)
    print(stu)
    # 第二种
    stu1 = student.objects.filter(name='顾轩2').filter(age=23)
    print(stu1)

    # 第三种
    dic = {'name': '顾轩2', 'age': 23}
    stu2 = student.objects.filter(**dic)
    print(stu2)

    # 第四种 Q查询  ~Q取反
    stu3 = student.objects.filter(
        Q(name='顾轩2') & Q(age=23))  # 或者    stu3 = student.objects.filter(Q(name='顾轩2'),Q(age=23))
    print(stu3)

    stu4 = student.objects.filter(~Q(name='顾轩2') | Q(age=23))
    print(stu4)
    return HttpResponse('查询成功')


def index6(request):
    # 第一种模糊过滤查询方法’
    # 查询名字首个为顾的
    stu = student.objects.filter(name__startswith='顾')
    print(stu)
    # 查询名字末尾为2的
    stu2 = student.objects.filter(name__endswith='2')
    print(stu2)
    # 查询名字保包含2的
    stu3 = student.objects.filter(name__contains='3')
    print(stu3)

    # 查询名年龄是22 和 20的用户
    stu4 = student.objects.filter(age__in=[20, 22])
    print(stu4)

    # 查询名年龄是20到22之间的用户 ,包括20和22
    stu4 = student.objects.filter(age__range=[20, 22])
    print(stu4)

    # 查询年龄大于20的数据  大于等于gte
    stu5 = student.objects.filter(age__gt=20)
    print(stu5)

    # 查询年龄小于20的数据  小于等于 lte
    stu6 = student.objects.filter(age__lt=20)
    print(stu6)

    # F和Q查询
    stu7 = student.objects.get(id=9)
    stu7.age += 5
    stu7.save()

    student.objects.filter(id=9).update(age=F('age') + 5)
    return HttpResponse('查询成功')


def index7(request):
    # order_by('age') 从小到大排序  order_by('-age')从大到小排序
    stu = student.objects.order_by('-age')
    print(stu)

    # 查个数
    stu_count = student.objects.count()
    print(stu_count)

    #查询第一条数据
    stu2 = student.objects.first()
    print(stu2)

    # 查询最后一条数据
    stu3 = student.objects.last()
    print(stu3)

    # 取数据中年龄的平均值
    print(student.objects.all().aggregate(Avg('age')))
    # 取数据中年龄的总和
    print(student.objects.all().aggregate(Sum('age')))

    # 就查询数据的id以及名字
    print(student.objects.all().values('id', 'name'))  # 查询出来是以字典形式

    print(student.objects.all().values_list('id', 'name'))  # 查询出来是以元祖形式

    # 去重
    print(student.objects.all().values_list('age').distinct())

    return HttpResponse('查询成功')
